<?php
/**
 * @category 	XmlGenerator.php
 * @author 		Sung Hoon, Cho (akdddnet@gmail.com)
 * @since		2011. 1. 14.
 * @license		BSD License
 * @version		0.1 
 * @uses
 *  $xml = new XmlGenerator("Books");
 *  foreach($list as $lists) {
 *     	$xml->startElement("Lists");
 *	   	$xml->addNode($lists, true);
 *	   	$xml->endElement("Lists");
 *	}
 *		
 *	$xml->printXml();
 *
 * 다른 오픈 프레임워크 처럼 배열을 넘기면 자동으로 xml으로 변환되게 할려고 했으나..
 * 수작업이 좀 들어가더라도 xml을 좀 더 유연하게 개발하기 위해 개발 방향을 바꿈.
 */

require_once "Common.php";

class XmlGenerator {
	
	private $header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";	// header
	private $root;
	
	private $xml; 	// 리턴될 xml 정보.
	private $line_break = "\n";	// 줄바꿈 문자.
	
	private $start_cdata = "<![CDATA[";
	private $end_cdata = "]]>";
	
	/**
	 * root 파라메터에 값을 설정하지 않으면 최상위 element 이름은 root가 됩니다.
	 * @param string $root
	 */
	function __construct($root="root") {
		$this->root = $root;
		
		$this->xml = $this->header.$this->line_break;
		$this->xml .= "<".$root.">".$this->line_break;
	}
	
	/**
	 * 부모 Element를 생성합니다 자식 노드를 추가 한 후에는 반드시 endElement를 사용해주셔야 합니다.
	 * @param string $el	: element name
	 * @param array $attr	: 속성(Attribute)
	 */
	function startElement($el, array $attr=null) {
		$this->xml .= "<".$el;
		
		if($attr != null) {
			foreach($attr as $key=>$value) {
				$this->xml .= ' '.$key.'="'.$value.'"';
			}
		}
		
		$this->xml .= ">".$this->line_break;
	}
	
	
	/**
	 * 자식 노드를 추가 합니다. 
	 * 
	 * @param object $list		: 리스트 
	 * @param boolean $is_cdata	: CDATA 태그 사용 여부.
	 */
	function addNode($list, $is_cdata=false) {
		if(!Common::isNullOrEmpty($list)) {
			foreach($list as $el => $value) {
				if($is_cdata) {
					$this->xml .= "<".$el.">".$this->start_cdata.$value.$this->end_cdata."</".$el.">".$this->line_break;
				} else {
					$this->xml .= "<".$el.">".$value."</".$el.">".$this->line_break;	
				}
			}
		}
	}
	
	/**
	 * 
	 * 부모 Element tag를 종료 합니다.
	 * @param string $el
	 */
	function endElement($el) {
		$this->xml .= "</".$el.">".$this->line_break;
	}
	
	
	/**
	 * 생성된 Xml String을 리턴 합니다.
	 */
	function getXml() {
		$this->xml .= "</".$this->root.">";
		return $this->xml;
	}
	
	/**
	 * 생성된 XML을 XML문서로 출력 합니다. 
	 */
	function printXml(){
		header("Content-type: text/xml;charset=utf-8");
		header("Cache-Control: no-cache, must-revalidate");
		header("Pragma: no-cache");
		echo self::getXml();
		exit;
	}
	
}